﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Collections.ObjectModel;



namespace UniCT.LinkShareWpf.Model 
{
    // La decorazione [DataContract]: si tratta di un oggetto che viene utilizzato all'interno del contratto
    // (definisce metodi e oggetti scambiati nella comunicazione). 
    // Questo perché potrebbero esserci dai campi che nella comunicazione non interessano:
    // in quel caso, se non si mette la decorazione DataMember essi non vengono presi in considerazione.  
    // KnownType permette di includere nel DataContract le informazioni sui tipi derivati, ovvero nel nostro caso ContentInfoTVS
    // XmlInclude si utilizza per specificare i tipi della classi derivate quando XmlSerializer serializza oggetti che includono sia classi basi che derivate, permette di riconoscere entrambi i tipi
    // DataContract indica il fatto che la classe rappresenta un tipo del contratto ed è serializzabile.
    // DataMember indica le proprietà o i campi che vogliamo serializzare
    [DataContract]
    [Serializable]
    [KnownType(typeof(ContentInfoTVS))]
    [XmlInclude(typeof(ContentInfoTVS))]
    public class ContentInfo
    {

        #region Private
        [DataMember]
        private string director;
        [DataMember]
        private string title;
        [DataMember]
        private string storyline;
        [DataMember]
        private EnumGenre genre;
        [DataMember]
        private EnumLanguage language;
        [DataMember]
        private EnumLanguage? subTitleLanguage; //oggetto nullable
        [DataMember]
        private UInt32 year;
        [DataMember]
        private UInt32 duration;
        [DataMember]
        private ObservableCollection<string> cast;
        [DataMember]
        private string coverName;
        #endregion

        #region Properties

        public string Director
        {
            get { return director; }
            set { director = value; }
        }

        public string Title
        {
            get { return title; }
            set { title = value; }
        }

        public string Storyline
        {
            get { return storyline; }
            set { storyline = value; }
        }

        public EnumGenre Genre
        {
            get { return genre; }
            set { genre = value; }
        }

        public EnumLanguage Language
        {
            get { return language; }
            set { language = value; }
        }

        public EnumLanguage? SubTitleLanguage
        {
            get { return subTitleLanguage; }
            set { subTitleLanguage = value; }
        }

        public UInt32 Year
        {
            get { return this.year; }
            set { year = value; }
        }

        public UInt32 Duration
        {
            get { return this.duration; }
            set { duration = value; }
        }

        public String CoverName
        {
            get { return this.coverName; }
            set { coverName = value; }
        }

        // Applicando l'attributo XmlArray, si può cambiare il nome dell'elemento Xml: Nodes -> MyNodes
        // Recupera o imposta un oggetto che specifica come XmlSerializer serializza un campo pubblico o una proprietà in lettura/scrittura 
        // Invece XmlArrayItem, agisce allo stesso modo ma per i relativi Item
        [XmlArray("Cast")]
        [XmlArrayItem("Actor")]
        public ObservableCollection<string> Cast
        {
            get { return cast; }
            set { cast = value; }
        }

        #endregion

        public ContentInfo()
        {
            cast = new ObservableCollection<string>();
        }

        public ContentInfo(ContentInfo copy)
        {
            this.Cast = copy.Cast;
            this.CoverName = copy.CoverName;
            this.Director = copy.Director;
            this.Duration = copy.Duration;
            this.Genre = copy.Genre;
            this.Language = copy.Language;
            this.Storyline = copy.Storyline;
            this.SubTitleLanguage = copy.SubTitleLanguage;
            this.Title = copy.Title;
            this.Year = copy.Year;
        }

        

    }

    public enum EnumGenre
    {    
        Animazione,
        Avventura,
        Azione,
        Biografia,
        Commedia,
        Criminale,
        Documentale,
        Drammatico,
        Family,
        Fantasy,
        Guerra,
        Horror,
        Musical,
        Mistery,
        Romantico,
        Scientifico,
        Sportivo,
        Storico,
        Thriller,
        Western
    }

    public enum EnumLanguage
    {
        Arabo,
        Cinese,
        Francese,
        Giapponese,
        Inglese,
        Italiano,
        Spagnolo,
        Tedesco
    }
}
